package cl.tinet.trainee.tarea6b.dao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;

import cl.tinet.trainee.tarea6b.model.Sala;

/**
 * Clase que implementa los metodos de la interfaz InterfazUsuarioBeanDAO.
 * 
 * @author Jose Ignacio
 * 
 */
public class SalaDAO implements SalaImpDAO, Serializable {
    /**
     * servialVersionUID.
     */
    private static final long serialVersionUID = 1L;

    /**
     * Manejador de entidad.
     */
    private EntityManager em;

    /**
     * Constructor que inicializa el manejador de entidad em para cada objeto
     * UsuarioDAO creado.
     * 
     * @param em
     *            Manejador de entidad.
     */
    public SalaDAO(EntityManager em) {
        this.em = em;
    }

    /**
     * Recibe del bean un usuario y lo agrega a la base de datos.
     * 
     * @param nuevoUsuario
     *            Es el objeto usuario que recibe el metodo y agrega a la base
     *            de datos.
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void agregar(Sala nuevaSala) {
        em.persist(nuevaSala);
    }

    /**
     * Recibe del bean un usuario y lo elimina de la base de datos.
     * 
     * @param usuarioAEliminar
     *            Es el objeto usuario que recibe el metodo, para buscarlo y
     *            eliminar a su par.
     */
    public void borrar(Sala salaAEliminar) {
        if (buscar(salaAEliminar) != null) {
            em.remove(buscar(salaAEliminar));
        }
    }

    /**
     * Recibe del bean un usuario y lo actualiza a la base de datos.
     * 
     * @param usuarioAActualizar
     *            Es el objeto usuario que recibe el metodo, para buscarlo y
     *            actualizar sus datos.
     */
    public void actualizar(Sala salaAActualizar) {

        if (buscar(salaAActualizar) != null) {
            em.merge(salaAActualizar);
        }
    }

    /**
     * {@inheritDoc}
     */
    public Sala leer(String username) {
        return (Sala) em
                .createQuery(
                        "SELECT U FROM Sala U WHERE U.username=:username")
                .setParameter("username", username).getSingleResult();
    }

    /**
     * Recibe del bean un String con el atributo username y lee sus atributos
     * desde la base de datos.
     * 
     * @param usuarioABuscar
     *            Objeto tipo usuario que se busca en la base de datos.
     * @return Usuario encontrado es retornado para desplegar sus datos.
     */
    public Sala buscar(Sala salaABuscar) {
        Sala resultado = null;
        List<Sala> salas = em
                .createQuery(
                        "SELECT U FROM Sala U WHERE U.nombre =:nombre")
                .setParameter("nombre", salaABuscar.getNombre())
                .getResultList();
        
        if(salas != null && !salas.isEmpty()){
            resultado = salas.get(0);
        }
        return resultado;
    }

    /**
     * Metodo que retorna la lista de todos los usuarios.
     * 
     * @return Retorna una lista con todos los usuarios de la base de datos.
     */
    public ArrayList<Sala> listar() {
        return (ArrayList<Sala>) em.createQuery("SELECT U FROM Sala U")
                .getResultList();
    }

    public static boolean login(String user, String password) {
        return false;

    }
}
